// 这个文件中包含标量版本的GEMM实现

#include "common.h"

#define PUT_IN_REGISTER register

/**
 * @brief 算法 1：基础版本GEMM。
 *        这个函数是darknet中默认的GEMM标量实现。为了简洁，我们删除了原型中部分不必要的参数。
 * @param[in]     M     矩阵A的行数
 * @param[in]     N     矩阵B的列数
 * @param[in]     K     矩阵A的列数和矩阵B的行数
 * @param[in]     ALPHA 标量系数
 * @param[in]     A     矩阵A的指针
 * @param[in]     B     矩阵B的指针
 * @param[in,out] C     输出矩阵C的指针
 * @return void
 */
void gemm_nn(int M, int N, int K, float ALPHA, float *A, float *B, float *C) {
  int i, j, k;
  for (i = 0; i < M; ++i) {
    for (k = 0; k < K; ++k) {
      register float A_PART = ALPHA * A[i * K + k];
      for (j = 0; j < N; ++j) {
        C[i * N + j] += A_PART * B[k * N + j];
      }
    }
  }
}
